<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="OhU1N" id="OhU1N"><span data-lake-id="u5c95d20c" id="u5c95d20c">典型回答</span></h1>
  <p data-lake-id="u91d91904" id="u91d91904"><span data-lake-id="u94b94edb" id="u94b94edb">Java中的异常，主要可以分为两大类，即受检异常（checked exception）和 非受检异常（unchecked exception）</span></p>
  <p data-lake-id="ub2ccb362" id="ub2ccb362"><span data-lake-id="uc7efad08" id="uc7efad08">​</span><br></p>
  <p data-lake-id="uf65cefcc" id="uf65cefcc"><span data-lake-id="u198de6d4" id="u198de6d4">对于</span><strong><span data-lake-id="u041cc5e2" id="u041cc5e2">受检异常</span></strong><span data-lake-id="u336ece83" id="u336ece83">来说，如果一个方法在声明的过程中证明了其要有受检异常抛出：</span></p>
  <p data-lake-id="u357ae56a" id="u357ae56a"><code data-lake-id="u17c20d06" id="u17c20d06"><span data-lake-id="ubc96eeb2" id="ubc96eeb2">public void test() throws Exception{}</span></code></p>
  <p data-lake-id="u95d8ba74" id="u95d8ba74"><span data-lake-id="ud75491d9" id="ud75491d9">​</span><br></p>
  <p data-lake-id="u237cf84d" id="u237cf84d"><span data-lake-id="uafb86bd5" id="uafb86bd5">那么，当我们在程序中调用他的时候，一定要对该异常进行处理（捕获或者向上抛出），否则是无法编译通过的。这是一种强制规范。</span></p>
  <p data-lake-id="u702af675" id="u702af675"><span data-lake-id="u4eb27c5b" id="u4eb27c5b">​</span><br></p>
  <p data-lake-id="u37d18cb9" id="u37d18cb9"><span data-lake-id="ud9bfa551" id="ud9bfa551">这种异常在IO操作中比较多。比如FileNotFoundException ，当我们使用IO流处理一个文件的时候，有一种特殊情况，就是文件不存在，所以，在文件处理的接口定义时他会显示抛出FileNotFoundException，起目的就是告诉这个方法的调用者，我这个方法不保证一定可以成功，是有可能找不到对应的文件的，你要明确的对这种情况做特殊处理哦。</span></p>
  <p data-lake-id="u60fd47fc" id="u60fd47fc"><span data-lake-id="u267076ad" id="u267076ad">​</span><br></p>
  <p data-lake-id="uf7db6041" id="uf7db6041"><span data-lake-id="uc42e2698" id="uc42e2698">所以说，当我们希望我们的方法调用者，明确的处理一些特殊情况的时候，就应该使用受检异常。</span></p>
  <p data-lake-id="u109cf2d7" id="u109cf2d7"><span data-lake-id="ue25a9588" id="ue25a9588">​</span><br></p>
  <p data-lake-id="u2dbf76c6" id="u2dbf76c6"><span data-lake-id="u912022d8" id="u912022d8">对于</span><strong><span data-lake-id="u9755a386" id="u9755a386">非受检异常</span></strong><span data-lake-id="u7cd9f208" id="u7cd9f208">来说，一般是运行时异常，继承自RuntimeException。在编写代码的时候，不需要显示的捕获，但是如果不捕获，在运行期如果发生异常就会中断程序的执行。</span></p>
  <p data-lake-id="ue217e0dc" id="ue217e0dc"><span data-lake-id="uc633b4be" id="uc633b4be">​</span><br></p>
  <p data-lake-id="u434198b7" id="u434198b7"><span data-lake-id="uec97fefa" id="uec97fefa">这种异常一般可以理解为是代码原因导致的。比如发生空指针、数组越界等。所以，只要代码写的没问题，这些异常都是可以避免的。也就不需要我们显示的进行处理。</span></p>
  <p data-lake-id="ud048fd2c" id="ud048fd2c"><span data-lake-id="u23d9fcc7" id="u23d9fcc7">​</span><br></p>
  <p data-lake-id="u2deaa1cf" id="u2deaa1cf"><span data-lake-id="ufcb5d906" id="ufcb5d906">试想一下，如果你要对所有可能发生空指针的地方做异常处理的话，那相当于你的所有代码都需要做这件事。</span></p>
  <h1 data-lake-id="Nwobi" id="Nwobi"><span data-lake-id="udca7fc9d" id="udca7fc9d">知识扩展</span></h1>
  <h2 data-lake-id="OhxcU" id="OhxcU"><strong><span data-lake-id="ued5192e9" id="ued5192e9" class="lake-fontsize-24" style="color: rgb(38, 38, 38)">什么是</span></strong><span data-lake-id="uc551b63c" id="uc551b63c">Throwable</span></h2>
  <p data-lake-id="u0c9a95c3" id="u0c9a95c3"><span data-lake-id="u3d019c10" id="u3d019c10">Throwable是java中最顶级的异常类，继承Object，实现了序列化接口，有两个重要的子类：Exception和 Error，二者都是 Java 异常处理的重要子类，各自都包含大量子类。</span></p>
  <h2 data-lake-id="GedQ8" id="GedQ8"><span data-lake-id="u81c0dc4f" id="u81c0dc4f">Error和Exception的区别和联系</span></h2>
  <p data-lake-id="u7b06e6c4" id="u7b06e6c4"><span data-lake-id="u6b53df08" id="u6b53df08">error表示系统级的错误，是java运行环境内部错误或者硬件问题，不能指望程序来处理这样的问题，除了退出运行外别无选择，它是Java虚拟机抛出的。如OutOfMemoryError、StackOverflowError&#x0;这两种常见的错误都是ERROR。</span></p>
  <p data-lake-id="ua2b7192a" id="ua2b7192a"><span data-lake-id="u419c36ca" id="u419c36ca">​</span><br></p>
  <p data-lake-id="ue3904eb1" id="ue3904eb1"><span data-lake-id="uc9bd8dce" id="uc9bd8dce">exception 表示程序需要捕捉、需要处理的异常，是由与程序设计的不完善而出现的问题，程序必须处理的问题。分为RuntimeException和其他异常</span></p>
  <h2 data-lake-id="HOxf9" id="HOxf9"><span data-lake-id="ue6f6225f" id="ue6f6225f" style="color: var(--yq-text-primary)">请列举几个常用的RuntimeException。</span></h2>
  <p data-lake-id="u7f0af5e3" id="u7f0af5e3"><span data-lake-id="u6cd783ec" id="u6cd783ec">这个题目，其实面试官考的还挺多的，主要是考察面试者实战经验是否丰富，所以常见的RuntimeException要能回答的尽量多回答一些。</span></p>
  <p data-lake-id="u15271642" id="u15271642"><span data-lake-id="u76b50eb5" id="u76b50eb5">​</span><br></p>
  <p data-lake-id="u9229e755" id="u9229e755"><span data-lake-id="ufee5f5c5" id="ufee5f5c5">AnnotationTypeMismatchException, ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DataBindingException, DOMException, EmptyStackException, EnumConstantNotPresentException, EventException, FileSystemAlreadyExistsException, FileSystemNotFoundException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, IllformedLocaleException, ImagingOpException, IncompleteAnnotationException, IndexOutOfBoundsException, JMRuntimeException, LSException, MalformedParameterizedTypeException, MirroredTypesException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NoSuchMechanismException, NullPointerException, ProfileDataException, ProviderException, ProviderNotFoundException, RasterFormatException, RejectedExecutionException, SecurityException, SystemException, TypeConstraintException, TypeNotPresentException, UndeclaredThrowableException, UnknownEntityException, UnmodifiableSetException, UnsupportedOperationException, WebServiceException, WrongMethodTypeException</span></p>
  <h2 data-lake-id="yxd6L" id="yxd6L"><span data-lake-id="ufcfe3013" id="ufcfe3013">说一说个Java异常处理相关的几个关键字，以及简单用法。</span></h2>
  <p data-lake-id="u179f8253" id="u179f8253"><span data-lake-id="u8ed7a5e2" id="u8ed7a5e2">throws、throw、try、catch、finally</span></p>
  <ol list="ua5ed5453">
   <li fid="ua97f4456" data-lake-id="uc55aaee0" id="uc55aaee0"><span data-lake-id="u308f5fa6" id="u308f5fa6">try用来指定一块预防所有异常的程序；</span></li>
   <li fid="ua97f4456" data-lake-id="u10f9a243" id="u10f9a243"><span data-lake-id="u8817c0e7" id="u8817c0e7">catch子句紧跟在try块后面，用来指定你想要捕获的异常的类型；</span></li>
   <li fid="ua97f4456" data-lake-id="u39223b4a" id="u39223b4a"><span data-lake-id="u4db8918e" id="u4db8918e">finally为确保一段代码不管发生什么异常状况都要被执行；</span></li>
   <li fid="ua97f4456" data-lake-id="u01dcda40" id="u01dcda40"><span data-lake-id="u3c6350dd" id="u3c6350dd">throw语句用来明确地抛出一个异常；</span></li>
   <li fid="ua97f4456" data-lake-id="u2cdf27a3" id="u2cdf27a3"><span data-lake-id="udd1552d4" id="udd1552d4">throws用来声明一个方法可能抛出的各种异常</span><span data-lake-id="u7b1dc828" id="u7b1dc828" class="lake-fontsize-11" style="color: var(--yq-text-primary)">；</span></li>
  </ol>
  <h2 data-lake-id="OIhir" id="OIhir"><span data-lake-id="u59451915" id="u59451915" style="color: var(--yq-text-primary)">什么是自定义异常，如何使用自定义异常？</span></h2>
  <p data-lake-id="ue9053390" id="ue9053390"><br></p>
  <p data-lake-id="u4dc21571" id="u4dc21571"><span data-lake-id="u32536cd4" id="u32536cd4">自定义异常就是开发人员自己定义的异常，一般通过继承Exception的子类的方式实现。</span></p>
  <p data-lake-id="ueb17ec36" id="ueb17ec36"><span data-lake-id="ufeeef96a" id="ufeeef96a">​</span><br></p>
  <p data-lake-id="u6efe7ae8" id="u6efe7ae8"><span data-lake-id="u76104bb8" id="u76104bb8">编写自定义异常类实际上是继承一个API标准异常类，用新定义的异常处理信息覆盖原有信息的过程。</span></p>
  <p data-lake-id="u0bf54c6c" id="u0bf54c6c"><span data-lake-id="uc961239e" id="uc961239e">​</span><br></p>
  <p data-lake-id="uef5dea5d" id="uef5dea5d"><span data-lake-id="u6e0a3790" id="u6e0a3790">这种用法在Web开发中也比较常见，一般可以用来自定义业务异常。如余额不足、重复提交等。这种自定义异常有业务含义，更容易让上层理解和处理。</span></p>
 </body>
</html>